package main

import (
	"math"
)

/**
110. 平衡二叉树
给定一个二叉树，判断它是否是高度平衡的二叉树。

本题中，一棵高度平衡二叉树定义为：

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1：
输入：root = [3,9,20,null,null,15,7]
输出：true
示例 2：


输入：root = [1,2,2,3,3,null,null,4,4]
输出：false
示例 3：

输入：root = []
输出：true
提示：

树中的节点数在范围 [0, 5000] 内
-104 <= Node.val <= 104
*/

func isBalanced(root *TreeNode) bool {
	isBan := true
	reBinTree(root, &isBan)
	return isBan
}

func reBinTree(root *TreeNode, isBan *bool) {
	if !*isBan || root == nil {
		return
	}
	lh := getHight(root.Left)
	rh := getHight(root.Right)
	if math.Abs(float64(lh-rh)) > 1 {
		*isBan = false
	}
	reBinTree(root.Left, isBan)
	reBinTree(root.Right, isBan)
}

func getHight(root *TreeNode) (h int) {
	if root == nil {
		return 0
	}
	if root.Left == nil && root.Right == nil {
		return 1
	}
	lh := getHight(root.Left)
	rh := getHight(root.Right)
	if lh > rh {
		return lh + 1
	}
	return rh + 1
}
